package org.jeese.common.base.service;

import java.util.List;
import java.util.Map;
import java.util.Set;

public interface RedisService {
	
	/**
	 * 加锁
	 * @param key
	 * @param expectedTime
	 * @return
	 */
	public boolean lock(String key, String expectedTime);
	
	/**
	 * 解锁
	 * @param key
	 * @param expectedTime
	 */
	public void unlock(String key, String expectedTime);
	
	/**
	 * 设值
	 * @param key
	 * @param value
	 * @return
	 */
	public boolean set(String key, String value);
	
	/**
	 * 将 key 的值设为 value ，当且仅当 key 不存在。
	 * 若给定的 key 已经存在，则 SETNX 不做任何动作。
	 * @param key
	 * @param expectedTime
	 * @return
	 */
	public boolean setnx(String key, String value);
	
	/**
	 * 设置key和value的超时时间(设置成String返回类型,不然要设置成Void)
	 * @param key
	 * @param timeout
	 * @param value
	 */
	public boolean setex(String key, Long timeout, String value);
	
	/**
	 * 取值
	 * @param key
	 * @return
	 */
	public String get(String key);
	
	/**
	 * @param key
	 * @param value
	 * @return
	 */
	public String getSet(String key, String value);
	
	
	/**
	 * 删除
	 * @param key
	 * @return
	 */
	public long del(String key);
	
	/** 
     * 判断key是否存在 
     * @param key 键 
     * @return true 存在 false不存在 
     */  
	public boolean hasKey(String key);
	
	/**
	 * 是否存在
	 * @param key
	 * @return
	 */
	public boolean exists(String key);
	

	/**
	 * 指定缓存失效时间 
	 * @param key
	 * @param expire
	 * @return
	 */
	public boolean expire(String key, long expire);
	
	/** 
     * 根据key 获取过期时间 
     * @param key 键 不能为null 
     * @return 时间(秒) 返回0代表为永久有效 
     */  
    public long getExpire(String key);

	/**
	 * 设值list
	 * @param key
	 * @param list
	 * @return
	 */
	public <T> boolean setList(String key, List<T> list);

	/**
	 * 取值list
	 * @param key
	 * @param clz
	 * @return
	 */
	public <T> List<T> getList(String key, Class<T> clz);
	
	/**
	 * 设值map
	 * @param key
	 * @param map
	 * @return
	 */
	public <T> boolean setMap(String key, Map<String,T> map);
	
	/**
	 * 取值map
	 * @param key
	 * @return
	 */
	public <T> Map<String,T> getMap(String key);

	
	
	//================= List ===========================
	/**
	 * 将一个或多个值插入到列表头部
	 * @param key
	 * @param obj
	 * @return
	 */
	public long lpush(String key, String value);

	/**
	 * 将一个或多个值插入到列表的尾部(最右边)。
	 * @param key
	 * @param obj
	 * @return
	 */
	public long rpush(String key, String value);

	/**
	 * 移除并返回列表的第hou一个元素。
	 * @param key
	 * @return
	 */
	public String lpop(String key);
	
	/**
	移除并返回列表的最后一个元素。
	 * @param key
	 * @return
	 */
	public String rpop(String key);
	
	/**
     * 字符串类型:
     * 对存储在指定key的数值执行原子的加1操作。
     * 如果指定的key不存在，那么在执行incr操作之前，会先把它的值设定为0.
     * 如果指定的key中存储的值不是字符串类型或者存储的字符串类型不能表示为一个整数，那么执行这个命令时服务器会返回一个错误。
     * 注意：由于redis并没有一个明确的类型来表示整型数据，所以这个操作是一个字符串操作。
     * 执行这个操作的时候，key对应存储的字符串被解析为10进制的64位有符号整型数据。
     * 这个操作仅限于64位的有符号整型数据。
     * 事实上，redis内部采用整数形式来存储对应的整数值，所以对该类字符串值实际上是用整数保存，也就不存在存储整数的字符串表示所带来的额外消耗。
     * incr的原子操作是说即使多个客户端对同一个key发出incr命令，也决不会导致竞争的情况，
     * 例如如下情况永远不可能发生：客户端1和客户端2同时读出10，他们俩都对其加到11，然后将新值设置为11，最终值一定为12
     * @param key
     * @return
     */
    public long incr(String key);
    
    /** 
     * 对key对应的数字做减一操作。如果key不存在，那么在操作之前，这个key对应的值会被设定为0。
     * 如果key有一个错误类型的value或者是一个不能表示成数字的字符串，就返回错误。这个操作最大支持在64位有符号的整型数字。 
     * @param key 键 
     * @param by 要减少几(小于0) 
     * @return 
     */  
    public long decr(String key);
	
	/** 
     * 将key进行递增。如果key不存在，操作之前，key就会被置为0.如果key的value类型错误或者是个不能表示成数字的字符串，就返回错误。
     * 这个操作最多支持64位有符号的整形数字.
     * @param key 键 
     * @param by 要增加几(大于0) 
     * @return 
     */  
    public long incrBy(String key, long delta);
    
    /** 
     * 将key对应的数字递减。如果key不存在，操作之前，key就会被置为0.如果key的value类型错误或者是个不能表示成数字的字符串，就返回错误。
     * 这个操作最多支持64位有符号的整形数字。
     * @param key 键 
     * @param by 要减少几(小于0) 
     * @return 
     */  
    public long decrBy(String key, long delta);
    
    
    //================= Set ===========================
    /**
     * 添加集合
     * 实现命令：SADD key member，将一个 member元素加入到集合 key当中，已经存在于集合的 member元素将被忽略。 
	 * @param key
	 * @param value
	 * @return
	 */
	public long sadd(String key, String value);
	
	/**
	 * 实现命令：SMEMBERS key，返回集合 key 中的所有成员。  
	 * @param key
	 * @return
	 */
	public Set<byte[]> smembers(String key);
	
	/** 
     * 删除set集合中的对象 
     * @param key 
     * @param value 
     */  
	public long srem(String key, String value);
	
	/** 
     * set重命名 
     * @param oldkey 
     * @param newkey 
     */  
    public boolean srename(String oldkey, String newKey);
    
    /** 
     * 模糊查询keys 
     * @param pattern 
     * @return 
     */  
    public Set<byte[]> keys(String pattern);
    
    //================= Sort Set ===========================
    /**
     * 实现命令：ZADD key score member，将一个 member元素及其 score值加入到有序集 key当中。
     * @param key
     * @param score
     * @param member
     */
    public boolean zadd(String key, double score, String member);
    
    /** 
     * 实现命令：zrange key start stop，返回有序集 key中，指定区间内的成员。 
     * @param key 
     * @param start 
     * @param end 结束  0 到 -1代表所有值 
     * @return 
     */  
    public Set<byte[]> zrange(String key, long start, long end);
    
    //================= Hash ===========================
    /** 
     * 实现命令：HSET key field value，将哈希表 key中的域 field的值设为 value 
     * @param key 
     * @param field 
     * @param value 
     */  
    public boolean hset(String key, String field, String value);
      
    /** 
     * 实现命令：HGET key field，返回哈希表 key中给定域 field的值 
     * @param key 
     * @param field 
     * @return 
     */  
    public String hget(String key, String field); 
      
    /** 
     * 实现命令：HDEL key field [field ...]，删除哈希表 key 中的一个或多个指定域，不存在的域将被忽略。 
     * @param key 
     * @param fields 
     */  
    public long hdel(String key, String fields);
      
    /** 
     * 实现命令：HGETALL key，返回哈希表 key中，所有的域和值。 
     * @param key 
     * @return 
     */  
    public Map<byte[], byte[]> hgetall(String key);
}

